package com;

import java.util.Arrays;

public class array {

    public static String toString(int[] arr) {
        // 判断数组是否为空
        if (arr == null) {
            return "null"; // 结束
        }
        if (arr.length == 0) {
            return "[]";
        }

        String ret = "["; //
        for (int index = 0; index < arr.length; index++) {
            // 如果不是最后一个元素，拼接 元素 + “，”， 否则  元素 + "]"
            ret = (index != arr.length - 1) ?
                    ret + arr[index] + ", "
                    : ret + arr[index] + "]";
        }
        return ret;
    }

    public static int[] bubbleSort(int[] arr) {
        for (int i = 1; i <= arr.length - 1; i++) {
            for (int j = 0; j <= arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 使用临时交换变量 arr[i] & arr[i+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }

    public static void loop_arr(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }

    }

    public static int count_arr(int[][] arr) {
        int total_count = 0;
        for (int[] outarr : arr) {
            for (int item : outarr) {
                System.out.println(item);
                total_count++;
            }
        }
        return total_count;
    }


    public static void main(String[] args) {
        //int[] arr;//  数组元素类型 []    数组名;   声明一个数组
//        int arr[]; // 不推荐
        // init arr
        int[] arr = new int[]{1, 2, 3};
        System.out.println(arr[0]);

        // getClass()：类似 Python 的 type()，用于获取对象的类型。
        System.out.println("arr的类型是: " + arr.getClass().getName());
        System.out.println("arr的 class 是: " + arr.getClass());

        // instanceof：用于检查对象是否是某个类或接口的实例。
        Object obj = 124124;
        if (obj instanceof Integer) {
            System.out.println("obj 是 int类型的");
        } else {
            System.out.println("obj 不是int类型的");
        }

        // 简单写法，必须声明的同时初始化
        int[] arr_simple = {10, 20, 30};
        System.out.println(arr_simple);   // 内存地址的哈希表示：  [I@1b6d3586      是对象的十六进制哈希值。每个数组对象都有唯一的哈希值。
        System.out.println(Arrays.toString(arr_simple));   //  [10, 20, 30]
        System.out.println(Arrays.toString(arr_simple).getClass().getName()); //  java.lang.String
        for (int i = 0; i < arr_simple.length; i++) {
            System.out.println(arr_simple[i]);
        }

        for (int value : arr_simple) {
            System.out.println(value);
        }

        // 动态数组初始化
        // 数组名 = new 数组元素类型[length]
        int[] arr_dynamic = new int[3]; // 系统自动为数组元素分配初始值
        System.out.println(Arrays.toString(arr_dynamic));  //  [0, 0, 0]
        System.out.println(Arrays.toString(arr_dynamic).getClass().getName());  //  java.lang.String
        arr_dynamic[0] = 1412;
        arr_dynamic[1] = 1612;
        arr_dynamic[2] = 1454412;
        System.out.println(Arrays.toString(arr_dynamic)); //    [1412, 1612, 1454412]

        int[] new_arr = new int[]{1, 2, 3, 4, 5};
        int len = new_arr.length; // 数组长度,
        int num = new_arr[0];
        new_arr[0] = 2024;
        System.out.println(num);
        System.out.println("len = " + len);
        int n = 0;
        while (n < len) {
            System.out.println("这里是while:" + new_arr[n]);
            n++;
        }

        for (int value : new_arr) {
            //增强 for 循环 （for-each）
            // 只能访问数组元素，不能赋值，不关心数组的引用时使用
            // 当数组元素是引用类型是，不建议使用（需要先知道值不为null 的元素的个数）
            System.out.println("这里是for-each:" + value);
        }

        String res = toString(new_arr);
        System.out.println(res);

        int[] sort_arr = new int[]{64, 34, 154, 54, 20, 9849, 32487, 15, 41, 60, 4131, 246, 0, 231, 465, 3, 2, 3, 1564, 8748, 14, 97};
        System.out.println("这个是旧数组:" + Arrays.toString(sort_arr));
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println("这个是当前时间戳: " + currentTimeMillis);

        double start_time = currentTimeMillis / 1000.0;
        int[] new_sort_arr = bubbleSort(sort_arr);
        long currentTimeMillis1 = System.currentTimeMillis();
        double end_time = currentTimeMillis1 / 1000.0;
        double total = end_time - start_time;
        System.out.println("冒泡排序总耗时: " + total);
        System.out.println("这个是新的数组:" + Arrays.toString(new_sort_arr));

        // static
        int[][] arr2 = new int[][]{{53}, {124, 5325, 51}, {1}};
        int[][] arr3 = {{12, 34, 56}, {9, 8}, {4567}};
        // dynamic
        int[][] arr4 = new int[3][];
        int[][] arr5 = new int[3][5];
        //
        System.out.println("=========== arr2 ================");
        loop_arr(arr2);
        int total_num = count_arr(arr2);
        System.out.println("arr2 一共有:" + total_num + "个元素");
        System.out.println("=========== arr3 ================");
        loop_arr(arr3);
        int total_num2 = count_arr(arr3);
        System.out.println("arr3 一共有:" + total_num2 + "个元素");
        System.out.println("=========== arr4 ================");
//        loop_arr(arr4);
//        count_arr(arr4);
        System.out.println("=========== arr5 ================");
        loop_arr(arr5);
        int total_num5 = count_arr(arr5);
        System.out.println("arr5 一共有:" + total_num5 + "个元素");

    }
}
